#ifndef GRIPPER_JSON_HPP
#define GRIPPER_JSON_HPP

#include <jsoncpp/json/json.h>
#include <string>
#include <iostream>
#include <memory> 

namespace gripper_control{

    class GripperJsonConverter
    {
    public:
        GripperJsonConverter(){}
        ~GripperJsonConverter(){}
        
        //double coord_x, coord_y, coord_z;  

        // 抓手反馈变量名：当前的分解动作、当前正在执行的指令，当前所处步骤
        int current_action, gripper_current_command, gripper_step;
        // 抓手执行变量名：执行指令、错误码（0、1）
        int operate_command, error_code;

        std::string json_msg;

        // 设置坐标值
        void set_from_command(int o_cmd);
        void set_from_error(int e_code);

        // 生成并返回JSON字符串
        std::string get_cmd_json_string() const;
        std::string get_error_json_string() const;

        // 从JSON字符串解析数据
        bool parse_json_string(const std::string& json_str);

        // 获取当前存储的JSON消息
        const std::string& get_json_msg() const { return json_msg; }


        // 获取坐标值
        int get_cur_act() const { return current_action; }
        int get_zhua_cur_cmd() const { return gripper_current_command; }
        int get_zhua_step() const { return gripper_step; }

        
    };


    inline void GripperJsonConverter::set_from_command(int o_cmd)
    {
        operate_command = o_cmd;
    }

    inline void GripperJsonConverter::set_from_error(int e_code)
    {
        error_code = e_code;
    }


    inline std::string GripperJsonConverter::get_cmd_json_string() const 
    {

        Json::Value json_val;
        json_val["cmd_value"] = operate_command;

        Json::StreamWriterBuilder builder;
        builder["indentation"] = ""; // 紧凑格式
        std::string result = Json::writeString(builder, json_val);

        return result;
        
    }

    inline std::string GripperJsonConverter::get_error_json_string() const 
    {

        Json::Value json_val;
        json_val["error_code"] = error_code;

        Json::StreamWriterBuilder builder;
        builder["indentation"] = ""; // 紧凑格式
        std::string result = Json::writeString(builder, json_val);

        return result;
        
    }
    
    inline bool GripperJsonConverter::parse_json_string(const std::string& json_str)
    {
        Json::Value json_val;
        Json::CharReaderBuilder reader_builder;
        std::string errors;

        std::unique_ptr<Json::CharReader> reader(reader_builder.newCharReader());
        
        if (!reader->parse(json_str.c_str(), json_str.c_str() + json_str.length(), &json_val, &errors)) {
            std::cerr << "JSON parse error: " << errors << std::endl;
            return false;
        }

        try {
            current_action = json_val["cur_act"].asInt();
            gripper_current_command = json_val["zhua_cur_cmd"].asInt();
            gripper_step = json_val["zhua_step"].asInt();
            
            // 更新json_msg
            json_msg = json_str;
            return true;
        } 
        catch (const std::exception& e) {
            std::cerr << "Error accessing JSON values: " << e.what() << std::endl;
            return false;
        }
    }
}



#endif